package cn.mini.mybatis.mybatis.executor.statementHandler;

import cn.mini.mybatis.mybatis.executor.resultset.ResultSetHandler;
import cn.mini.mybatis.mybatis.mapping.BoundSql;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;

public interface StatementHandler {

    /**
     * 准备 SQL 语句执行所需的 Statement 对象。
     * 该方法会根据传入的数据库连接对象，创建并初始化一个 Statement 对象，
     * 用于后续执行 SQL 语句。不同的 Statement 实现（如 PreparedStatement、CallableStatement 等）
     * 可能会有不同的初始化逻辑。
     *
     * @param connection 数据库连接对象，用于创建 Statement 对象。
     * @return 初始化后的 Statement 对象，可用于执行 SQL 语句。
     * @throws SQLException 当创建或初始化 Statement 对象过程中出现数据库相关错误时抛出。
     */
    Statement prepare(Connection connection) throws SQLException;

    void parameterize(Statement statement, BoundSql boundSql) throws SQLException;
    /**
     * 执行查询操作，使用指定的 Statement 对象执行 SQL 查询，并处理查询结果。
     * 该方法会将查询结果通过 ResultHandler 进行处理，最终返回一个包含查询结果的列表。
     *
     * @param <E> 结果列表中元素的类型，由调用者指定。
     * @param statement 用于执行 SQL 查询的 Statement 对象，通常由 prepare 方法创建。
     * @param resultHandler 结果处理器，用于处理查询结果，将结果转换为指定类型的对象。
     * @return 包含查询结果的列表，列表中的元素类型为 E。
     * @throws SQLException 当执行 SQL 查询过程中出现数据库相关错误时抛出。
     */
    <E> List<E> query(Statement statement, ResultSetHandler resultHandler) throws SQLException;

}